#include <iostream>
#include <pthread.h>
#include <mutex>
#include <thread>
#include <condition_variable>
#include <signal.h>
#include <unistd.h>
using namespace std;
class person
{
public:
    static void* Init(void* argc)
    {
        static person per;
        return &per;
    }
private:
    int age;
    int name;
    person()
    {
        cout << "person()" << endl;
    }
    person(const person &per) = delete;
    person& operator=(const person& per) = delete;
};

// void* init(void* arg)
// {
//     person::Init();
// }

// int n = 100;
// mutex mtx;
// condition_variable cv;
// bool flag = true;
// void oddnum()
// {
//     int i = 1;
//     while (i <= 100)
//     {
//         unique_lock<mutex> ul(mtx);
//         cv.wait(ul, []() { return flag; }); // 等待条件变量满足
//         cout << this_thread::get_id() << ":" << i << endl;
//         i += 2;
//         flag = false;
//         cv.notify_one(); // 唤醒条件变量下等待的一个线程
//     }
// }
// void evennum()
// {
//     int j = 2;
//     while (j <= 100)
//     {
//         unique_lock<mutex> ul(mtx);
//         cv.wait(ul, []() { return !flag; }); // 等待条件变量满足
//         cout << this_thread::get_id() << ":" << j << endl;
//         j += 2;
//         flag = true;
//         cv.notify_one(); // 唤醒条件变量下等待的一个线程
//     }
// }

int n = 100;
mutex mtx;
condition_variable cv;
bool flag = true;
void oddnum()
{
    unique_lock<mutex> lk(mtx);
    while (n > 0)
    {
        while(flag == false)
            cv.wait(lk);
        cout << n-- << endl;
        flag = true;
        // n--;
        cv.notify_one();
    }
}
void evennum()
{
    unique_lock<mutex> lk(mtx);
    while (n > 0)
    {
        while(flag == true)
            cv.wait(lk);
        cout << n-- << endl;
        flag = false;
        // n--;
        cv.notify_one();
    }
}

volatile int count = 0;
void handle(int signal)
{
    // cout << endl;
    // cout << signal << endl;
    cout << count << endl;
    // abort();
    exit(1);
}
int main()
{
    // pthread_t _pth;
    // // pthread_create(&_pth, nullptr, init, nullptr);
    // pthread_create(&_pth, nullptr, person::Init, nullptr);

    // pthread_join(_pth, nullptr);
    // thread t1(evennum);
    // thread t2(oddnum);
    // t1.join();
    // t2.join();
    // signal(SIGABRT, handle);
    // while(true)
    // {
    //     cout << "hello signal" << endl;
    //     sleep(1000);
    // }
    // return 0;
    signal(SIGALRM, handle);
    alarm(1);
	while (1)
    {
		count++;
		//printf("count: %d\n", count);
	}
    //COUT << COUNT << ENDL;
    //cout << count << endl;
    return 0;
}


